// LogicSystem.h
#pragma once
#include <string>
#include <memory>
#include <functional>
#include <future>
#include <unordered_map>
#include <queue>
#include <map>
#include <condition_variable>
#include "ThreadPool.h" 
#include "global.h"
#include <functional>
#include "session.h"
#include <string>
#include <json/json.h>
#include <json/value.h>
#include <json/reader.h>
class IOThread;

typedef std::function<void(std::shared_ptr<Session>, size_t msg_id, std::string msg_data)> FunCallBack;
class LogicSystem {
public:
    // 获取单例实例
    static LogicSystem& Instance() {
        static LogicSystem instance;
        return instance;
    }

    // 获取单例实例的另一个方法（为了兼容性）
    static LogicSystem* GetInstance() {
        return &Instance();
    }

    // 投递消息到逻辑队列
    void PostMsgToQue(std::shared_ptr <LogicNode> msg);
    // 停止逻辑系统
    void Stop();

private:
    LogicSystem();  // 私有构造函数
    ~LogicSystem();

    // 禁用拷贝和赋值
    LogicSystem(const LogicSystem&) = delete;
    LogicSystem& operator=(const LogicSystem&) = delete;

    //消息处理
    void DealMsg();
    
    void RegisterCallBacks();
    void HelloWordCallBack(std::shared_ptr<Session> session, size_t msg_id, std::string msg_data);
    void PingCallBack(std::shared_ptr<Session> session, size_t msg_id, std::string msg_data);//收到客户端的 PING，回复一个 PONG
private:
    //ThreadPool _thread_pool;                   // 工作线程池
    std::thread _worker_thread;       
    std::mutex _queue_mutex;                   // 队列互斥锁
    std::condition_variable _queue_cv;         // 条件变量
    std::queue<std::shared_ptr<LogicNode>> _msg_que;          // 消息队列
    std::atomic<bool> _running;               // 运行状态标志

    std::map<size_t, FunCallBack> _fun_callbacks;
};
